/* Copyright (c) 2011 Alexandre Défossez
 * This file is part of HINAPT.
 *
 * HINAPT is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * HINAPT is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HINAPT.  If not, see <http://www.gnu.org/licenses/>.
 */

 /*!
  \file GLThread.hpp
  Thread chargé de l'affichage de la scène en 3D.
 */

#ifndef GLTHREAD_HPP
#define GLTHREAD_HPP

#include "_tracker.hpp"
#include "ThQueue.hpp"

/*!
  Utilisé pour la communication entre le thread qui suit les yeux et GLThread.
*/
struct HinaptState {
  /*!
    Vaut true si jamais les yeux ont été perdu
  */
  bool hasBeenLost;
};


/*!
  Thread chargé de l'affichage de la scène en 3D
*/
class GLThread: public sf::Thread
{
  public:
    /*!
      \param[in] AppGL fenêtre SFML sur laquelle il faut dessiner la scène
      \param[in] AppLock verrou utilisé pour les opérations qui ne sont
      pas thread-safe
      \param[in} headPosQueue Queue dans laquelle sont placé les positions de
      la tête trouvée par le thread de suivi
      \param GLuint targetTexture texturez a utiliser pour les cibles
      \param[in] hinaptState permet la communication entre le thread de suivi
      et GLThread

    */
    GLThread(sf::RenderWindow &AppGL, sf::Mutex &AppLock,
             ThQueue<std::pair<Point3d, double> > &headPosQueue,
             GLuint targetTexture, HinaptState &hinaptState);
  protected:
  private:
    sf::RenderWindow &AppGL;
    sf::Mutex &AppLock;
    ThQueue<std::pair<Point3d, double> > &headPosQueue;
    GLuint targetTexture;
    HinaptState &hinaptState;

    /*!
      Dessine la scène
      \param pos position actuelle de la tête
    */
    void draw(Point3d pos);
    /*!
      Dessine une cible
      \param x position en x
      \param y position en y
      \param z position en z
      \param radius rayon de la cible
      \param params structure utilisée par OpenGL
    */
    void drawTarget(double x, double y, double z, double radius,
                    GLUquadric* params);
    /*!
      Dessine la grille autour des cibles
    */
    void drawGrid();
    /*!
      Réalise une capture d'écran
    */
    void doCapture();
    /*!
      Fonction principale du thread
    */
    virtual void Run();

};

#endif // GLTHREAD_HPP
